home *** CD-ROM | disk | FTP | other *** search
/ PC World Komputer 2010 April / PCWorld0410.iso / pluginy Firefox / 7684 / 7684.xpi / components / fmProtocolHandler.js
Text File  |  2009-11-20  |  7KB  |  218 lines

  1. /**
  2.  * Copyright (c) 2008, Jose Enrique Bolanos, Jorge Villalobos
  3.  * All rights reserved.
  4.  *
  5.  * Redistribution and use in source and binary forms, with or without
  6.  * modification, are permitted provided that the following conditions are met:
  7.  *
  8.  *  * Redistributions of source code must retain the above copyright notice,
  9.  *    this list of conditions and the following disclaimer.
  10.  *  * Redistributions in binary form must reproduce the above copyright notice,
  11.  *    this list of conditions and the following disclaimer in the documentation
  12.  *    and/or other materials provided with the distribution.
  13.  *  * Neither the name of Jose Enrique Bolanos, Jorge Villalobos nor the names
  14.  *    of its contributors may be used to endorse or promote products derived
  15.  *    from this software without specific prior written permission.
  16.  *
  17.  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
  18.  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
  19.  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
  20.  * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER
  21.  * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
  22.  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
  23.  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
  24.  * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
  25.  * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
  26.  * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
  27.  * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  28.  **/
  29.  
  30. const Cc = Components.classes;
  31. const Ci = Components.interfaces;
  32. const Cr = Components.results;
  33. const Ce = Components.Exception;
  34.  
  35. const CLASS_ID = Components.ID("{AE6C9422-FB46-4C0A-86D2-9C10A2E9B5CB}");
  36. const CLASS_NAME = "Fire.fm protocol";
  37. const CONTRACT_ID = "@mozilla.org/network/protocol;1?name=firefm";
  38.  
  39. // Regular expression for the stations (station/type/id).
  40. const STATION_REGEX = /^firefm:(?:\/\/)?station\/([^\/]+)\/([^\/]+)/i;
  41.  
  42. /**
  43.  * Handles the firefm protocol
  44.  */
  45. function fmProtocolHandler() {
  46. }
  47.  
  48. fmProtocolHandler.prototype = {
  49.  
  50.   scheme : "firefm",
  51.  
  52.   defaultPort : -1,
  53.  
  54.   protocolFlags :
  55.     (Ci.nsIProtocolHandler.URI_NORELATIVE | Ci.nsIProtocolHandler.URI_NOAUTH),
  56.  
  57.   allowPort: function(port, scheme) {
  58.     return false;
  59.   },
  60.  
  61.   newURI : function(aSpec, aCharset, aBaseURI) {
  62.     let uri = Cc["@mozilla.org/network/simple-uri;1"].createInstance(Ci.nsIURI);
  63.     uri.spec = aSpec;
  64.  
  65.     return uri;
  66.   },
  67.  
  68.   newChannel : function(aInputURI) {
  69.     let ioService =
  70.       Cc["@mozilla.org/network/io-service;1"].getService(Ci.nsIIOService);
  71.     let regexResult = STATION_REGEX.exec(aInputURI.spec);
  72.  
  73.     if (regexResult && (3 == regexResult.length)) {
  74.       let win =
  75.         Cc['@mozilla.org/appshell/window-mediator;1'].
  76.           getService(Ci.nsIWindowMediator).
  77.             getMostRecentWindow("navigator:browser");
  78.  
  79.       let stationObj = win.FireFM.Station;
  80.       let id = regexResult[2];
  81.  
  82.       switch (regexResult[1]) {
  83.         case "artist":
  84.           win.FireFMChrome.BrowserOverlay.verifyStation(
  85.             id, stationObj.TYPE_ARTIST);
  86.           break;
  87.         case "user":
  88.           win.FireFMChrome.BrowserOverlay.verifyStation(
  89.             id, stationObj.TYPE_USER);
  90.           break;
  91.         case "tag":
  92.           win.FireFMChrome.BrowserOverlay.verifyStation(
  93.             id, stationObj.TYPE_TAG);
  94.           break;
  95.         case "recommended":
  96.           stationObj.setStation(id, stationObj.TYPE_RECOMMENDED);
  97.           stationObj.play();
  98.           break;
  99.         case "neighborhood":
  100.           stationObj.setStation(id, stationObj.TYPE_NEIGHBORHOOD);
  101.           stationObj.play();
  102.           break;
  103.         case "loved":
  104.           stationObj.setStation(id, stationObj.TYPE_LOVED);
  105.           stationObj.play();
  106.           break;
  107.       }
  108.     }
  109.  
  110.     // XXX: Return "javascript:" to satisfy the method signature without
  111.     // not actually loading anything in the browser.
  112.     return ioService.newChannel("javascript:", null, null);
  113.   },
  114.  
  115.   /**
  116.    * The QueryInterface method provides runtime type discovery.
  117.    * More: http://developer.mozilla.org/en/docs/nsISupports
  118.    * @param aIID the IID of the requested interface.
  119.    * @return the resulting interface pointer.
  120.    */
  121.   QueryInterface : function(aIID) {
  122.     if (!aIID.equals(Ci.nsIProtocolHandler) &&
  123.         !aIID.equals(Ci.nsISupports)) {
  124.       throw Cr.NS_ERROR_NO_INTERFACE;
  125.     }
  126.  
  127.     return this;
  128.   }
  129. };
  130.  
  131. /**
  132.  * The nsIFactory interface allows for the creation of nsISupports derived
  133.  * classes without specifying a concrete class type.
  134.  * More: http://developer.mozilla.org/en/docs/nsIFactory
  135.  */
  136. var fmProtocolHandlerFactory = {
  137.   createInstance: function (aOuter, aIID) {
  138.     if (null != aOuter) {
  139.       throw Cr.NS_ERROR_NO_AGGREGATION;
  140.     }
  141.     return (new fmProtocolHandler()).QueryInterface(aIID);
  142.   }
  143. };
  144.  
  145. /**
  146.  * The nsIModule interface must be implemented by each XPCOM component. It is
  147.  * the main entry point by which the system accesses an XPCOM component.
  148.  * More: http://developer.mozilla.org/en/docs/nsIModule
  149.  */
  150. var fmProtocolHandlerModule = {
  151.   /**
  152.    * When the nsIModule is discovered, this method will be called so that any
  153.    * setup registration can be preformed.
  154.    * @param aCompMgr the global component manager.
  155.    * @param aLocation the location of the nsIModule on disk.
  156.    * @param aLoaderStr opaque loader specific string.
  157.    * @param aType loader type being used to load this module.
  158.    */
  159.   registerSelf : function(aCompMgr, aLocation, aLoaderStr, aType) {
  160.     aCompMgr.QueryInterface(Ci.nsIComponentRegistrar);
  161.     aCompMgr.registerFactoryLocation(
  162.       CLASS_ID, CLASS_NAME, CONTRACT_ID, aLocation, aLoaderStr, aType);
  163.   },
  164.  
  165.   /**
  166.    * When the nsIModule is being unregistered, this method will be called so
  167.    * that any cleanup can be preformed.
  168.    * @param aCompMgr the global component manager.
  169.    * @param aLocation the location of the nsIModule on disk.
  170.    * @param aLoaderStr opaque loader specific string.
  171.    */
  172.   unregisterSelf : function (aCompMgr, aLocation, aLoaderStr) {
  173.     aCompMgr.QueryInterface(Ci.nsIComponentRegistrar);
  174.     aCompMgr.unregisterFactoryLocation(CLASS_ID, aLocation);
  175.   },
  176.  
  177.   /**
  178.    * This method returns a class object for a given ClassID and IID.
  179.    * @param aCompMgr the global component manager.
  180.    * @param aClass the ClassID of the object instance requested.
  181.    * @param aIID the IID of the object instance requested.
  182.    * @return the resulting interface pointer.
  183.    * @throws NS_ERROR_NOT_IMPLEMENTED if aIID is inadequate.
  184.    * @throws NS_ERROR_NO_INTERFACE if the interface is not found.
  185.    */
  186.   getClassObject : function(aCompMgr, aClass, aIID) {
  187.     if (!aIID.equals(Ci.nsIFactory)) {
  188.       throw Cr.NS_ERROR_NOT_IMPLEMENTED;
  189.     }
  190.  
  191.     if (aClass.equals(CLASS_ID)) {
  192.       return fmProtocolHandlerFactory;
  193.     }
  194.  
  195.     throw Cr.NS_ERROR_NO_INTERFACE;
  196.   },
  197.  
  198.   /**
  199.    * This method may be queried to determine whether or not the component
  200.    * module can be unloaded by XPCOM.
  201.    * @param aCompMgr the global component manager.
  202.    * @return true if the module can be unloaded by XPCOM. false otherwise.
  203.    */
  204.   canUnload: function(aCompMgr) {
  205.     return true;
  206.   }
  207. };
  208.  
  209. /**
  210.  * Initial entry point.
  211.  * @param aCompMgr the global component manager.
  212.  * @param aFileSpec component file.
  213.  * @return the module for the service.
  214.  */
  215. function NSGetModule(aCompMgr, aFileSpec) {
  216.   return fmProtocolHandlerModule;
  217. }
  218.